/**
 * 防抖 高频率触发的事件,在指定的时间内，只响应最后一次，如果在指定的时间内再次触发，则重新计算时间
 * 类似游戏里的回城，经历n秒后回到泉水，一旦打断则重新计算;防抖重在清零
 * @param fn 函数 里面可能是频繁的回调、ajax请求以及操作
 * @param delay 表示间隔多少秒触发，默认200毫秒
 * @returns 
 */
export function debounce(fn: Function, delay = 200) {
    let timer: NodeJS.Timeout | null = null;//定义一个变量，接收定时器进行判断 在没有执行定时器时为null
    return function () { //使用了闭包，一个函数内部返回另一个函数，避免垃圾回收机制回收
        if (timer) clearTimeout(timer); // 判断是否已经存在，如果存在清空定时器
        timer = setTimeout(() => {
            fn.apply(fn, arguments);
            timer = null;
        }, delay);
    };
}

/**
 * 节流 高频率触发的事件,在指定的单位时间内，只响应第一次,控制事件发生的频率
 * 比作过红绿灯，每等一个红灯时间就可以过一批。
 * @param fn 函数 里面可能是频繁的回调、ajax请求以及操作
 * @param delay 表示间隔多少秒触发，默认100毫秒
 * @returns 
 */
export function throttle(fn: Function, delay = 100) {
    let timer: NodeJS.Timeout | null = null;//定义一个变量，接收定时器进行判断 在没有执行定时器时为null
    return function () {
        if (timer) return;//判断定时器是否存在,如果存在,则表示定时器在运行，需要返回
        timer = setTimeout(() => {
            fn.apply(fn, arguments);
            timer = null;
        }, delay);
    };
}